/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.cratos.xxgram.platf.rongcloud;

import java.io.Serializable;
import org.redkale.convert.json.JsonConvert;
import org.redkale.util.Comment;

/**
 *
 * @author SquRab
 */
@Comment("融云基础消息")
public class RongCloudMessage {

    @Comment("单聊消息接口")
    public static final int PRIVATE = 0;
     
    @Comment("系统消息接口")
    public static final int SYSTEM = 1;

    @Comment("群聊消息接口")
    public static final int GROUP = 2;
    
    @Comment("聊天室消息接口")
    public static final int CHATROOM = 3;
    
    @Comment("发送人用户 Id。（必传）")
    protected int fromUserId;

    @Comment("接收用户 Id，可以实现向多人发送消息，每次上限为 1000 人。（必传）")
    protected int toUserId;

    @Comment("消息类型，参考融云消息类型表.消息标志；可自定义消息类型，长度不超过 32 个字符，您在自定义消息时需要注意，不要以 \"RC:\" 开头，以避免与融云系统内置消息的 ObjectName 重名。（必传）")
    protected String objectName;

    @Comment("消息内容")
    protected BaseContent content;

    @Comment("定义显示的 Push 内容，如果 objectName 为融云内置消息类型时，则发送后用户一定会收到 Push 信息。 如果为自定义消息，则 pushContent 为自定义消息显示的 Push 内容，如果不传则用户不会收到 Push 通知。(可选)")
    protected String pushContent;
    
    @Comment("针对 iOS 平台为 Push 通知时附加到 payload 中，客户端获取远程推送内容时为 appData 查看详细，Android 客户端收到推送消息时对应字段名为 pushData。(可选)")
    protected String pushData;
    
    @Comment("针对 iOS 平台，Push 时用来控制未读消息显示数，只有在 toUserId 为一个用户 Id 的时候有效，客户端获取远程推送内容时为 badge 查看详细，为 -1 时不改变角标数，传入相应数字表示把角标数改为指定的数字，最大不超过 9999。(可选)")
    protected int count;
    
    @Comment("是否过滤接收用户黑名单列表，0 表示为不过滤、 1 表示为过滤，默认为 0 不过滤。(可选)")
    protected int verifyBlacklist;
    
    @Comment("针对融云服务端是否存储此条消息，客户端则根据消息注册的 ISPERSISTED 标识判断是否存储，如果旧版客户端上未注册该消息时，收到该消息后默认为存储，但无法解析显示。0 表示为不存储、 1 表示为存储，默认为 1 存储消息。(可选)")
    protected int isPersisted;
    
    @Comment("终端用户在线状态下，发送用户自己是否接收消息，0 表示为不接收，1 表示为接收，默认为 0 不接收，只有在 toUserId 为一个用户 Id 的时候有效。如终端用户未登录，需要登录后也收到此条消息时，需要在开发者后台 IM 商用版中开通“多设备消息同步”功能。（可选）")
    protected int isIncludeSender;
    
    @Comment("针对 iOS 平台，对 SDK 处于后台暂停状态时为静默推送，是 iOS7 之后推出的一种推送方式。 允许应用在收到通知后在后台运行一段代码，且能够马上执行，查看详细。1 表示为开启，0 表示为关闭，默认为 0（可选）")
    protected int contentAvailable;

    @Comment("消息类型 系统消息 群组消息 私聊消息 决定调用融云的url")
    private transient int type;
    
    public int getFromUserId() {
        return fromUserId;
    }

    public void setFromUserId(int fromUserId) {
        this.fromUserId = fromUserId;
    }

    public int getToUserId() {
        return toUserId;
    }

    public void setToUserId(int toUserId) {
        this.toUserId = toUserId;
    }

    public String getPushContent() {
        return pushContent;
    }

    public void setPushContent(String pushContent) {
        this.pushContent = pushContent;
    }

    public String getPushData() {
        return pushData;
    }

    public void setPushData(String pushData) {
        this.pushData = pushData;
    }

    public int getCount() {
        return count;
    }

    public void setCount(int count) {
        this.count = count;
    }

    public int getVerifyBlacklist() {
        return verifyBlacklist;
    }

    public void setVerifyBlacklist(int verifyBlacklist) {
        this.verifyBlacklist = verifyBlacklist;
    }

    public int getIsPersisted() {
        return isPersisted;
    }

    public void setIsPersisted(int isPersisted) {
        this.isPersisted = isPersisted;
    }

    public int getIsIncludeSender() {
        return isIncludeSender;
    }

    public void setIsIncludeSender(int isIncludeSender) {
        this.isIncludeSender = isIncludeSender;
    }

    public int getContentAvailable() {
        return contentAvailable;
    }

    public void setContentAvailable(int contentAvailable) {
        this.contentAvailable = contentAvailable;
    }

    public int getType() {
        return type;
    }

    public void setType(int type) {
        this.type = type;
    }

    public String getObjectName() {
        return objectName;
    }

    public void setObjectName(String objectName) {
        this.objectName = objectName;
    }

    public BaseContent getContent() {
        return content;
    }

    public void setContent(BaseContent content) {
        this.content = content;
    }

    public RongCloudMessage() {
    }

    
    public RongCloudMessage(int fromUserId, int toUserId, String objectName, BaseContent content) {
        this.fromUserId = fromUserId;
        this.toUserId = toUserId;
        this.objectName = objectName;
        this.content = content;
    }

    public RongCloudMessage attach() {
        return this;
    }

    @Override
    public String toString() {
        return JsonConvert.root().convertTo(this);
    }
    
    @Comment("群组消息")
    public static class RongCloudGroupMessage extends RongCloudMessage implements Serializable {

        @Comment("接收群 Id，提供多个本参数可以实现向多群发送消息，最多不超过 3 个群组。（必传）")
        private String toGroupId;

        @Comment("子消息类型")
        private int msgSubtype;
        
        @Comment("状态接口子消息类型")
        public static final int SUB_MSG_STATUS = 20;
          
        @Comment("默认接口子消息类型")
        public static final int SUB_MSG_DEFAULT = 10;
        
        @Comment("是否为 @消息，"
                + "0 表示为普通消息，"
                + "1 表示为 @消息，默认为 0。"
                + "当为 1 时 content 参数中必须携带 mentionedInfo @消息的详细内容。为 0 时则不需要携带 mentionedInfo。"
                + "当指定了 toUserId 时，则 @ 的用户必须为 toUserId 中的用户。（可选）")
        private int isMentioned;

        public RongCloudGroupMessage() {
        }
        
        public RongCloudGroupMessage(int msgSubtype, int toGroupId, int isMentioned, int fromUserId, int toUserId, String objectName, BaseContent content) {
            super(fromUserId, toUserId, objectName, content);
            this.toGroupId = Integer.toString(toGroupId, 36);
            this.isMentioned = isMentioned;
            this.msgSubtype = msgSubtype;
        }

        public int getIsMentioned() {
            return isMentioned;
        }

        public void setIsMentioned(int isMentioned) {
            this.isMentioned = isMentioned;
        }

        public String getToGroupId() {
            return toGroupId;
        }

        public void setToGroupId(String toGroupId) {
            this.toGroupId = toGroupId;
        }
          public int getMsgSubtype() {
            return msgSubtype;
        }

        public void setMsgSubtype(int msgSubtype) {
            this.msgSubtype = msgSubtype;
        }
    }
    
}
